package server.services;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import model.Usuario;
import server.Servidor;
import server.dao.UsuarioDAO;
import server.exception.ServiceException;

/**
 * Esta clase encapsula las acciones que pueden realizarse sobre un usuario.
 * Todo aquel que desea obtener algun dato de usuario persistido deberia
 * pedirselo a esta clase
 * 
 * @author romeroy
 * 
 */
public class UsuarioService {
	private static UsuarioDAO DAO;
	
	public UsuarioService(){
		if(UsuarioService.DAO == null)
			UsuarioService.DAO = new UsuarioDAO();
	}
	
	
	/**
	 * Obtiene el usuario identificado por el id
	 * 
	 * @param id
	 *            Identificador de usuario
	 * @return El usuario en caso de que exista, null en caso contrario
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public Usuario obtener(int id) throws Exception {
		return DAO.obtener(id);
	}

	/**
	 * Obtiene el usuario identificado por el nombre de usuario y contraseña
	 * pasado por parametro
	 * 
	 * @param username
	 *            Nombre de usuario
	 * @param password
	 *            Contraseña
	 * @return El usuario en caso de que exista, null en caso contrario
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public Usuario obtener(String username, String password)
			throws Exception {
		return DAO.obtener(username, password);
	}

	/**
	 * Persiste un usuario en la base de datos
	 * 
	 * @param usuario
	 *            Usuario a guardar
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public boolean guardar(Usuario usuario) throws Exception {
		return DAO.guardar(usuario);
	}

	/**
	 * Actualiza la informacion de un usuario existente
	 * 
	 * @param usuario
	 *            Usuario a actualizar sus datos
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public boolean actualizar(Usuario usuario) throws Exception {
		return DAO.actualizar(usuario);
	}

	/**
	 * Elimina un usuario de la base de datos
	 * 
	 * @param usuario
	 *            Usuario a eliminar
	 * @return true en caso de exito, false en caso contrario
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public boolean eliminar(Usuario usuario) throws Exception {
		return DAO.eliminar(usuario);
	}

	/**
	 * Busca un usuario en la base de datos
	 * 
	 * @param ejemplo
	 *            Ejemplo que contiene los campos por lo que se filtrara el
	 *            usuario
	 * @return Lista de usuarios que coincidan con el patron pasado por
	 *         parametro, null en caso de no encontrar coincidencias
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public List<Usuario> buscar(Usuario ejemplo, Usuario llamador) throws Exception {
		return DAO.buscar(ejemplo.getNombre(), ejemplo.getApellido(), ejemplo.getNick(),llamador);
	}

	/**
	 * Obtiene una lista con todos los usuarios registrados y dados de alta
	 * 
	 * @return Lista de usuarios registrados en la base de datos
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public List<Usuario> todos() throws Exception {
		return DAO.todos();
	}
	
	/**
	 * Obtiene una lista con todos los usuarios conectados
	 * 
	 * @return Lista de usuarios conectados
	 * @throws Exception
	 *             En caso de que no se pueda concretar la accion
	 */
	public List<Usuario> conectados() throws Exception {
		return Servidor.getUsuariosConectados();
	}
	
	/**
	 * Verifica si un usuario esta conectado
	 * @param usuario usuario que se desea consultar su estado de conexion
	 * @return verdadero en caso afirmativo, falso en caso contrario
	 */
	public boolean estaConectado(Usuario usuario) throws Exception{
		return Servidor.isConectado(usuario);
	}
	
	/**
	 * Envia un mensaje del servidor al cliente conectado
	 * @param usuario
	 * @param mensaje
	 */
	public void enviarMensaje(Usuario usuario, String mensaje) {
		Servidor.enviarMensaje(usuario, mensaje);
	}
	
	/**
	 * Envia un mensaje del servidor a todos los clientes conectados
	 * @param mensaje
	 */
	public void enviarMensajeATodos(String mensaje) {
		Servidor.enviarMensajeAConectados(mensaje);
	}
	public void desconectar(Usuario u) throws ServiceException {
		try {
			Servidor.matarHiloCliente(u);
		} catch (IOException e) {
			throw new ServiceException("Hubo un problema al desconectar al cliente", e);
		}
	}
	
	
	public void close() throws SQLException
	{
		UsuarioService.DAO.close();
	}
}
